#include <iostream>
#include <future>
#include <memory>
#include <chrono>
#include <thread>

int Add(int num1, int num2)
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
    return num1 + num2;
}
// int main()
// {
//     std::packaged_task<int(int, int)> task(Add);
//     std::future<int> fu = task.get_future();
//     // task(1, 2); 
//     std::thread thread1(std::move(task), 1, 2);    //不能用线程
//     // std::async(std::launch::async, task, 1, 2);  //这个会创造线程，也不可以
//     // std::async(std::launch::async, task, 1, 2);  //不创造也不可以
//     std::cout << "------" << std::endl;     //这个先打印，说明，不创线程
//     std::cout << fu.get() << std::endl;
//     thread1.join();

//     // auto ptask = std::make_shared<std::packaged_task<int(int, int)>>(Add);
//     // auto fu = ptask->get_future();
//     // // std::thread thread1([ptask](){(*ptask)(1, 2);});
//     // // std::thread thread1(ptask.get(), 1, 2);
//     // // std::thread thread1(*ptask, 1, 2);
//     // std::thread thread1(std::move(ptask), 1, 2);
//     // std::cout << "------" << std::endl;   
//     // std::cout << fu.get() << std::endl;
//     // thread1.join();
//     return 0;
// }

// int main()
// {
//     std::packaged_task<int(int,int)> task(Add);
//     auto fut = task.get_future();
//     std::thread t(std::move(task), 1, 2);   // ✅ 必须 std::move
//     t.join();
//     std::cout << fut.get() << '\n';

// }
int main()
{
    std::packaged_task<int(int,int)> task(Add);
    auto fut = task.get_future();
    std::async(std::launch::async, std::move(task), 1, 2); // ✅
    std::cout << fut.get() << '\n';
}

